package com.agilya.controller;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.inject.Inject;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.agilya.dao.DAOChapitre;
import com.agilya.dao.DAOQuestion;
import com.agilya.dao.daointerface.ChapitreDAO;
import com.agilya.dao.daointerface.QuestionDAO;
import com.agilya.dao.exception.DAOExceptions;
import com.agilya.enumere.NiveauDifficulte;
import com.agilya.modele.Chapitre;
import com.agilya.modele.Question;
import com.agilya.utilitaires.Configuration;
import com.agilya.utilitaires.UploadImage;
import com.agilya.utilitaires.UploadImageExceptions;
import com.agilya.utilitaires.UploadImageMauvaisFormatExceptions;
import com.agilya.utilitaires.UploadInterface;

/**
 * Servlet implementation class SaisirQuestion
 * 
 * Permet de saisir une question
 * 
 */
@WebServlet("/SaisirQuestion")
public class SaisirQuestion extends HttpServlet {
	private static final long serialVersionUID = 1L;
	@Inject
	@DAOQuestion
	private QuestionDAO questiondao;

	@Inject
	@DAOChapitre
	private ChapitreDAO chapitredao;

	/**
	 * @see HttpServlet#HttpServlet()
	 */
	public SaisirQuestion() {
		super();
	}

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// Récupération des chapitres
		List<Chapitre> listeChapitres = new ArrayList<>();
		try {
			listeChapitres = chapitredao.getAllChapitre();
			request.setAttribute("listeChapitres", listeChapitres);

		} catch (Exception e) {
			request.setAttribute("pageErreur", "Une erreur est survenue. Veuillez recommencer plus tard.");
			e.printStackTrace();
		}

		request.setAttribute("page", "/saisirQuestion.jsp");
		RequestDispatcher rd = request.getRequestDispatcher("/page.jsp");
		rd.forward(request, response);

	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// dans le cas d'un essai de saisie infructueux
		// Récupération des chapitres
		List<Chapitre> listeChapitres = new ArrayList<>();
		try {
			listeChapitres = chapitredao.getAllChapitre();
			request.setAttribute("listeChapitres", listeChapitres);

		} catch (Exception e) {
			request.setAttribute("pageErreur", "Une erreur est survenue. Veuillez recommencer plus tard.");
			// System.out.println("Une erreur est survenue. Veuillez recommencer plus tard.");
			e.printStackTrace();
		}

		// *************/
		// Upload image*/
		// *************/

		// on récupére l'action
		String action = request.getParameter("action");

		if (action != null && action.equals("uploadImage")) {
			UploadInterface uploadImage = new UploadImage();
			List<String> listFilesNames;
			try {
				listFilesNames = uploadImage.UploadFile(request);

				for (String fileName : listFilesNames) {
					System.out.println(Configuration.getAbsolutePathDossierUploadImage(request) + fileName);
					request.setAttribute("srcImage", Configuration.SERVLET_AFFICHER_IMAGE + "?src=" + fileName);
				}
			} catch (UploadImageMauvaisFormatExceptions e) {
				System.out.println("problème upload image");
				request.setAttribute("erreurImage", "le format de l'image n'est pas reconnu");

			} catch (UploadImageExceptions e) {
				request.setAttribute("erreurImage", "Un problème est survenu durant l'upload de l'images");
				// Impossible d'enregistrer l'image
				e.printStackTrace();
			}
			request.setAttribute("page", "/saisirQuestion.jsp");
			RequestDispatcher rd = request.getRequestDispatcher("/page.jsp");
			rd.forward(request, response);
		}

		// ****************/
		// Saisie Question*/
		// ****************/
		Integer idquestion = null;

		// liste d'erreur
		ArrayList<String> listeErreur = new ArrayList<>();
		request.setAttribute("erreurs", listeErreur);

		RequestDispatcher rd = null;
		// récuperation du libellé de la question
		String libelle = request.getParameter("libelle");
		if (libelle == null || libelle.equals("")) {
			listeErreur.add("Vous devez saisir un libellé pour la question");
		}

		// Récupération des chapitres choisis par l'utilisateur
		Integer choixChapitre = null;
		try {
			choixChapitre = Integer.parseInt(request.getParameter("choixChapitre"));

			// On met en paramètre le précédent choix du chapitre
			request.setAttribute("choixChapitre", choixChapitre);

		} catch (NumberFormatException e) {
			listeErreur.add("Veuillez sélectionner un chapitre");
		}

		NiveauDifficulte niveauDifficulte = NiveauDifficulte.valueOf(request.getParameter("niveauDifficulte"));

		double coefficient = 1.; // coefficient par défaut à 1
		if (!request.getParameter("coefficient").equals("")) {
			try {
				coefficient = Double.parseDouble(request.getParameter("coefficient"));
			} catch (NumberFormatException nfe) {
				listeErreur.add("Vous devez saisir une valeur numérique pour le coefficient");
			}
		}

		if (listeErreur.size() == 0) {
			Question question = new Question(libelle, niveauDifficulte, coefficient);
			try {
				idquestion = questiondao.enregistrer(question, choixChapitre);
				System.out.println("id question genere :" + idquestion);
				request.setAttribute("idquestion", idquestion);
			} catch (DAOExceptions e) {
				request.setAttribute("erreurPage", "Une erreur est survenue, veuillez recommencer plus tard");
				e.printStackTrace();
			}

			rd = request.getRequestDispatcher("/SaisirProposition?idquestion=" + idquestion.intValue());
			rd.forward(request, response);
		} else {
			request.setAttribute("page", "/saisirQuestion.jsp");
			rd = request.getRequestDispatcher("/page.jsp");
			rd.forward(request, response);

		}

	}
}
